{ "cells": [ { "cell_type": "code", "execution_count": 1, "id": "peaceful-character", "metadata": {}, "outputs": [], "source": [ "# This tutorial will demonstrate some implementations of nested control\n", "# structures in Python. Nested structures very quickly become complicated\n", "# and hard to decipher. Python requires you to indent your code properly\n", "# which is an advantage because it makes the code easier to read/follow. " ] }, { "cell_type": "code", "execution_count": 2, "id": "photographic-aruba", "metadata": {}, "outputs": [], "source": [ "# In the while loop tutorial we should how you could calculate factorials\n", "# using while loops. Suppose you wanted to restrict users to inputing only\n", "# integer values of n. You can do this by placing your while loop inside\n", "# an if statement. The if statement will be used to check for valid\n", "# values of n." ] }, { "cell_type": "code", "execution_count": 5, "id": "speaking-assistant", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "5/2 has a remainder of 1\n", "4/2 has a remainder of 0\n" ] } ], "source": [ "# First, I introduce the % function. y % x outputs the remainder of\n", "# y/x.\n", "x = 5 % 2\n", "print('5/2 has a remainder of', x)\n", "x = 4 % 2\n", "print('4/2 has a remainder of', x)" ] }, { "cell_type": "code", "execution_count": 6, "id": "amended-pregnancy", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Invalid entry: n is noninteger.\n" ] } ], "source": [ "# So, here is our first nested set of control structures.\n", "n = 4.3\n", "if n % 1 == 0:\n", " print('n =', n)\n", " factorial = 1\n", " while n > 1:\n", " factorial = factorial*n\n", " n -= 1\n", " print('n! =', factorial)\n", "else:\n", " print('Invalid entry: n is noninteger.')" ] }, { "cell_type": "code", "execution_count": 7, "id": "stupid-drunk", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "n = -4\n", "n! = 1\n" ] } ], "source": [ "# Notice that we can still trick the system into producing nonsense by\n", "# entering a negative integer.\n", "n = -4\n", "if n % 1 == 0:\n", " print('n =', n)\n", " factorial = 1\n", " while n > 1:\n", " factorial = factorial*n\n", " n -= 1\n", " print('n! =', factorial)\n", "else:\n", " print('Invalid entry: n is noninteger.')" ] }, { "cell_type": "code", "execution_count": 8, "id": "electric-slave", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "n = 13\n", "n! = 6227020800\n" ] } ], "source": [ "# To fix this problem, we need to check that n is an integer AND positive.\n", "# We will use 'and' to add another condition to our if statement. \n", "# We will also implement some elseif statements so that we can present proper \n", "# error messages.\n", "#\n", "# In the elseif statements != means 'not equal to' and <= means 'less than\n", "# or equal to'. Try different entries for n. If you enter, for example, a\n", "# string for n you'll get an error message from Python. As you can see,\n", "# accounting for all the possible silly inputs users could enter requires a\n", "# lot of thorough and careful programming!\n", "n = 13\n", "if n % 1 == 0 and n > 0:\n", " print('n =', n)\n", " factorial = 1\n", " while n > 1:\n", " factorial = factorial*n\n", " n -= 1\n", " print('n! =', factorial)\n", "elif n == 0:\n", " print('n =', n)\n", " print('n! = 1')\n", "elif n % 1 != 0 and n > 0:\n", " print('Invalid entry: n is noninteger.')\n", "elif n % 1 == 0 and n < 0:\n", " print('Invalid entry: n negative.')\n", "elif n % 1 != 0 and n < 0:\n", " print('Invalid entry: n is noninteger and negative.')" ] }, { "cell_type": "code", "execution_count": 9, "id": "brilliant-nightmare", "metadata": {}, "outputs": [], "source": [ "# Now let's put our factorial code into a for loop so that we can calculate\n", "# n! as a function of n.\n", "import numpy as np" ] }, { "cell_type": "code", "execution_count": 10, "id": "criminal-enterprise", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23\n", " 24 25]\n" ] }, { "data": { "text/plain": [ "[1,\n", " 1,\n", " 2,\n", " 6,\n", " 24,\n", " 120,\n", " 720,\n", " 5040,\n", " 40320,\n", " 362880,\n", " 3628800,\n", " 39916800,\n", " 479001600,\n", " 6227020800,\n", " 87178291200,\n", " 1307674368000,\n", " 20922789888000,\n", " 355687428096000,\n", " 6402373705728000,\n", " 121645100408832000,\n", " 2432902008176640000,\n", " 51090942171709440000,\n", " 1124000727777607680000,\n", " 25852016738884976640000,\n", " 620448401733239439360000,\n", " 15511210043330985984000000]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" } ], "source": [ "start = 0\n", "finish = 25\n", "ns = np.arange(start, finish + 1, 1)\n", "print(ns)\n", "facts = []\n", "for i in ns:\n", " if i % 1 == 0 and i > 0:\n", " n = int(i)\n", " factorial = 1\n", " while n > 1:\n", " factorial = factorial*n\n", " n -= 1\n", " facts = facts + [factorial]\n", " elif i == 0:\n", " facts = facts + [1]\n", " elif i % 1 != 0 and n > 0:\n", " print('Invalid entry: n is noninteger.')\n", " elif i % 1 == 0 and n < 0:\n", " print('Invalid entry: n negative.')\n", " elif i % 1 != 0 and n < 0:\n", " print('Invalid entry: n is noninteger and negative.')\n", "facts" ] }, { "cell_type": "code", "execution_count": 11, "id": "generic-pantyhose", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# We can now easily make a plot of n! vs n. Notice how sharply n! rises.\n", "import matplotlib.pyplot as plt\n", "plt.plot(ns, facts, 'bo', fillstyle = 'none')\n", "plt.ylabel('n!')\n", "plt.xlabel('n')\n", "plt.title('linear-linear plot');" ] }, { "cell_type": "code", "execution_count": 12, "id": "intended-concrete", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Here's the same data on a log-log scale.\n", "plt.loglog(ns, facts, 'ro', fillstyle = 'none')\n", "plt.ylabel('n!');\n", "plt.xlabel('n')\n", "plt.title('log-log plot');" ] }, { "cell_type": "code", "execution_count": 14, "id": "welsh-rally", "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAYkAAAEaCAYAAADkL6tQAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjMuNCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8QVMy6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAotklEQVR4nO3de3hU5bn38e9NCIfQcJBQ0HAIFOSUomCIlrorpyoYEEWkoCgWClKRbd1oxQJiX8Wql7RuT7UqbCq1WAq2GxULlUMtYBFwVwUiGhEkBASjCAYCJHneP2YSwzATApmZNTP5fa4rV5hnTda6Jzpz5znczzLnHCIiIsHU8ToAERGJXUoSIiISkpKEiIiEpCQhIiIhKUmIiEhIShIiIhKSkoTUCma208wGRuC8fc0sP9znrcZ17zOzP0T7ulL7KEmIJLhIJUipHZQkREQkJCUJqXXMrL6ZPWZmBf6vx8ysfqXjPzezvf5jPzEzZ2Ydq3nurma2xswOmtlWM7uq0rHmZvaKmR0ys41m9oCZrQ1xngz/dSf649hrZlOruO5V/usd9F+/q799AdAWeMXMvjazn1f39yQCShJSO00HLgEuBC4AsoEZAGY2CPgvYCDQEbisuic1s2TgFWAF8G1gCvCimXX2P+UpoAhoBYz1f51OP6ATcDkwLdiwkZmdDywEfga0AJbhSwr1nHM3Ap8CQ51z33LOPVLd1yMCShJSO90A/D/n3H7n3AHgl8CN/mMjgf9xzm11zh3xH6uuS4BvAQ85544751YBrwKjzSwJuBaY5Zw74pzbBvy+Guf8pXOuyDn3PvA/wOggz/kR8Jpz7u/OuRPAo0BDoM8ZxC4SlJKE1EbnAbsqPd7lbys/trvSsYp/m1lb/5DN12b2dYjz7nbOlQWcOx3fX/h1Q527CpWfUznOwOtWvB7/9Xf7rytSI0oSUhsVAO0qPW7rbwPYC7SudKxN+T+cc5/6h2y+5Zz7VojztjGzyu+rtsAe4ABQEurcVaj8nMpxBl634vWYmfl/bk956NW4jkhQShJSGy0EZphZCzNLA+4FymsOFgE/9k9Ap/iPVdcGfHMOPzezZDPrCwwFXnLOlQIvA/eZWYqZdQFuqsY5Z/qf3x34MfCnIM9ZBOSY2QD/vMhU4Biw3n/8M6DDGbwOkQpKElIbPQBsAt4D3gfe8bfhnHsdeBxYDeQBb/l/5tjpTuqcOw5cBQwGPgeeBm5yzn3gf8ptQBNgH7AAX7I63Xn/4Y9jJfCoc25FkOtuB8YAT/ivOxTfRPVx/1N+hS8pHjSzO0/3OkQqM910SCQ0/1LSLUB951xJmM/9MNDKOXfKKiczywA+AZLDfV2RM6GehEgAM7vGzOqZWTPgYeCVcHxQm1kXM+thPtnAeOAvNT2vSCQpSYic6hZ8E80fA6XAT8N03lR88xJF+OYR5gD/G6Zzi0SEhptERCQk9SRERCQkJQkREQmprtcBlDOzq4EcfHvePOWcW+EvSrofaAxscs5VuY1BWlqay8jIiHSoIiIJZfPmzZ8751oEOxbRJGFm84AhwH7nXGal9kHAfwNJwPPOuYecc38F/upfUfIovk3ShuHbWuAL4LQ3dsnIyGDTpk1hfx0iIonMzHaFOhbp4ab5wKCAYJLw7YY5GOiGb/OzbpWeMsN/HKAz8JZz7r8I3woTERGppogmCefcm/h6AZVlA3nOuR3+itCXgGH+teMPA687597xPzcf+NL/79Jg1/Dvt7/JzDYdOHAgAq9CRKT28mLiOp2Td7bM97dNwbeH/wgzm+Q/9jJwhZk9AbwZ7GTOuWedc1nOuawWLYIOqYmIyFnyYuLagrQ559zj+PbMqdx4BF9V6lk7ceIE+fn5FBcX1+Q0CaNBgwa0bt2a5ORkr0MRkTjgRZLI5+Ttj1sTfPvj8FwsP5/U1FQyMjLw7aBceznnKCwsJD8/n/bt23sdjoiEw8KFMHs25OZC164wfTqMDnZvqrPjxXDTRqCTmbU3s3rAKGBppC5WXFxM8+bNa32CADAzmjdvrl6VSKJYuNCXFJ54AoqLfd+nT/e1h0lEk4SZLcS31XJnM8s3s/H+jdJuA5YDucAi59zWCMcRydPHFf0uRBLI7Nkwdy706wfJyb7vc+f62sMkosNNzrmgfR7n3DJ8N2uv1Xbu3MmQIUPYsmWL16GISDzKzYVLLz257dJLfe1hom05Ai1cCJmZkJTk+x7GbpuISFh17Qpr157ctnatrz1MlCQqi9D43s6dO+natSsTJkyge/fuXH755Rw9ejRMQYtIrTV9OowfD6tXw4kTvu/jx/vaw0RJorIIju999NFHTJ48ma1bt9K0aVOWLFkShoBFpFYbPdr3+TRlCjRo4Ps+e3ZYVzfFzAZ/MSGC43vt27fnwgsvBOCiiy5i586dXBp4LRGRMzV6dFiTQiD1JCqL4Phe/fr1K/6dlJRESUkJGRkZmrQWkZimJFFZFMb3RETiiZJEZVEY36usoKCAESNGROTcIiLhkFD3uM7KynKB95PIzc2laxiXgyUC/U5E4lgEtuEws83OuaxgxzRxLSISL8qX6c+d61tUs3atb0gcIjbioeEmEZF4EYVtOAIpSYiIxIsobMMRSElCRCReRGEbjkBKEiIi8cKDZfqauBYRiRflk9NTpnyzuimCy/RBPYm44pyjf//+HDp0qMrn3XnnnaxatSpKUYlIVI0eDVu2QGmp73sEEwQoScSVZcuWccEFF9C4ceMqnzdlyhQeeuihKEUlIolMSSJK/vCHP5Cdnc2FF17ILbfcwoYNG+jRowfFxcUUFRXRvXt3tmzZwpo1a/jBD37ANddcQ7du3Zg0aRJlZWUAvPjiiwwbNgyoevvxdu3aUVhYyL59+zx7vSKSGGrdnETfvn1PaRs5ciS33norR44c4corrzzl+M0338zNN9/M559/fso2GmvWrDntNXNzc/nTn/7EunXrSE5O5tZbb2X79u1cddVVzJgxg6NHjzJmzBgyMzNZs2YNb7/9Ntu2baNdu3YMGjSIl19+mREjRrBu3Tp+97vfVZz3o48+YuHChTz33HOMHDmSJUuWMGbMGAB69erFunXruPbaa8/sFyQiUol6ElGwcuVKNm/eTO/evbnwwgtZuXIlO3bs4N577+Xvf/87mzZt4uc//3nF87Ozs+nQoQNJSUmMHj2atf4lb1988QWpqakVzwu2/Xi5b3/72xQUFETl9YlIBHl8t8xa15Oo6i//lJSUKo+npaVVq+cQyDnH2LFj+dWvfnVS+759+/j66685ceIExcXFNGrUCAAzO+l55Y/r1q1LWVkZder4cnvg9uOV73ZXXFxMw4YNzzhWEYkhHmzDEUg9iSgYMGAAixcvZv/+/YCvR7Br1y4mTpzI/fffzw033MDdd99d8fy3336bTz75hLKyMv70pz9V3Jyoc+fO7Nixo1rX/PDDD8nMzAz/ixGR6PFgG45AMdWTMLOrgRzg28BTzrkVwdq8i/DsdOvWjQceeIDLL7+csrIykpOTGTZsGHXr1uX666+ntLSUPn36sGrVKurUqcP3vvc9pk2bxvvvv18xiQ2Qk5PDmjVr6NixY5XXO3HiBHl5eWRlBd3UUUTihQfbcJzCORfRL2AesB/YEtA+CNgO5AHTAo41A+aeri3w66KLLnKBtm3bdkpbLFu9erXLyckJeqygoMANHDjwtOd4+eWX3YwZM0Iej7ffiUit1b27c6tWndy2apWvPYyATS7E52o0hpvm+xNCBTNLAp4CBgPdgNFm1q3SU2b4j3Oatlrl3HPPZcKECactpispKWHq1KlRikpEIiYG7pYZ8eEm59ybZpYR0JwN5DnndgCY2UvAMDPLBR4CXnfOveM/ZoFtlZnZRGAiQNu2bSP2OqKlb9++QZfplhs5cuRpz3HdddeFMSIR8YwH23AE8mpOIh3YXelxPnAxMAUYCDQxs47OuWdCtFVwzj0LPAu+O9NFI3gRkagZPTqqSSGQV0nCgrQ559zjwOMBjae0nSnn3CnLSmsrl0C3qxWRyPNqCWw+0KbS49ZARCq/GjRoQGFhoT4c8SWIwsJCGjRo4HUoIhInvOpJbAQ6mVl7YA8wCrg+Ehdq3bo1+fn5HDhwIBKnjzsNGjSgdevWXochInEi4knCzBYCfYE0M8sHZjnn5prZbcByIAmY55zbGonrJycn0759+0icWkQk/BYu9E1Ol09UT5+e2HMSzrmgr845twxYFunri4jEjRjYhiOQtuUQEYkVMbANRyAlCRGRWBEL23AEUJIQEYkVXbv6hpgqW7vW1+4RJQkRkVgRA9twBIqpXWBFRGq1GNiGI5CShIhILPF4G45AGm4SEZGQlCRERCQkJQkRES8tXAiZmZCU5Pu+cKHXEZ1EcxIiIl6JwQrrQOpJiIh4JQYrrAMpSYiIeCUGK6wDKUmIiHglBiusAylJiIh4JQYrrANp4lpExCsxWGEdSElCRMRLMVZhHUjDTSIiEpKShIiIhKQkISIiISlJiIhES4xvwRGMJq5FRKIhDrbgCCZmehJm1sHM5prZ4kptbc1sqZnNM7NpXsYnIlIjcbAFRzARTRL+D/f9ZrYloH2QmW03s7zyD3/n3A7n3PiAU5wPvOacGwd0i2SsIiIRFQdbcAQT6Z7EfGBQ5QYzSwKeAgbj++AfbWahEsD/AaPMbBWwOoJxiohEVhxswRFMRJOEc+5N4IuA5mwgz99zOA68BAwLcYofA7Occ/2BnMhFKiISYXGwBUcwXkxcpwO7Kz3OBy42s+bAbKCnmd3jnPsV8DfgPjO7HtgZ7GRmNhGYCNC2bdtIxi0icvbiYAuOYLxIEhakzTnnCoFJAY1bgBFVncw59yzwLEBWVpYLV5AiImEX41twBOPF6qZ8oE2lx62BAg/iEBGR0/AiSWwEOplZezOrB4wClnoQh4iInEakl8AuBN4COptZvpmNd86VALcBy4FcYJFzbmsk4xARibo4rK4OJqJzEs65oINvzrllwLJIXltExDNxWl0dTMxUXIuIJIw4ra4ORklCRCTc4rS6OhglCRGRcIvT6upglCRERMItTqurg9FW4SIi4Ran1dXBKEmIiERCHFZXB6PhJhERCUlJQkREQlKSEBGpqQSprg5GcxIiIjWRQNXVwagnISJSEwlUXR2MkoSISE0kUHV1MEoSIiI1kUDV1cEoSYiI1EQCVVcHo4lrEZGaSKDq6mCUJEREaipBqquD0XCTiIiEpCQhIiIhKUmIiJyJBK6uDkZzEiIi1ZXg1dXBqCchIlJdCV5dHYyShIhIdSV4dXUwMZMkzKyDmc01s8UB7Y3MbLOZDfEqNhERIOGrq4OJaJIws3lmtt/MtgS0DzKz7WaWZ2bTAJxzO5xz44Oc5m5gUSTjFBGplgSvrg4m0hPX84EngRfKG8wsCXgK+CGQD2w0s6XOuW2BP2xmA4FtQIMIxykicnoJXl0dTESThHPuTTPLCGjOBvKcczsAzOwlYBi+ZBCoH9AI6AYcNbNlzrmyyk8ws4nARIC2bduG9wWIiARK4OrqYLyYk0gHdld6nA+km1lzM3sG6Glm9wA456Y7534G/BF4LjBB+J/zrHMuyzmX1aJFiyiELyJSe3hRJ2FB2pxzrhCYFOwHnHPzIxqRiIgE5UVPIh9oU+lxa6DAgzhEREKrZZXVoXjRk9gIdDKz9sAeYBRwvQdxiIgEVwsrq0OJ9BLYhcBbQGczyzez8c65EuA2YDmQCyxyzm2NZBwiImekFlZWh2LOOa9jCJusrCy3adMmr8MQkXiXlATFxb4EUe7ECWjQAEpLvYsrQsxss3MuK9ixmKm4FhGJGbWwsjoUJQkRkUC1sLI6FG0VLiISqBZWVodSZZIws/eB8kkLw1fP0MN/bJFzbmSE4xMR8UYtq6wO5XQ9iap2Xr09nIGIiEjsqXJOwjm3yzm3C9gHfB+4wczuNbN7gQnRCFBEJKJUNFel6s5J/C/wFbAZOBa5cEREokhFc6dVrToJM9vinMuMQjw1ojoJETkjmZnwxBO+Yrlyq1f7Jqy3bAn9cwkmHHUS683su2GMSUTEe7XwdqRnqrpJ4lJgs/9ucu+Z2ftm9l4kAxMRiTgVzZ1WdeckBkc0ChERL5QXzQXOSdTCPZpCqVaS8K9wEhFJLCqaOy1VXItI7aaiuSpp7yYREQlJSUJEEp8K5s6ahptEJLGpYK5G1JMQkcSmu8zViJKEiCS2BC+YKy0t5YUXXqCsrCwi51eSEJHElsAFc0eOHOHaa69l7Nix/O1vf4vINZQkRCSxJehd5g4cOED//v1ZunQpjz/+OFdeeWVErqOJaxFJbAlaMGdmFBcXs2TJEq655prIXac6u8BGg5l1AKYDTZxzI/xtjYCngePAGufci1WdQ7vAikii+/e//03Xrl2pX78+paWlJCUl1fic4dgF9mwvPM/M9pvZloD2Qf7NAvPMbBqAc26Hc258wCmGA4udcxOAqyIZq4hIrFuwYAEXX3wxM2fOBAhLgjidSM9JzAcGVW4wsyTgKXybBnYDRptZtxA/3xrY7f93aYRiFJFEkMAFc6WlpUybNo2bbrqJPn36cPfdd0ft2hFNEs65N4EvApqzgTx/z+E48BIwLMQp8vElCtAku4iEUl4w98QTUFzs+z59ekIkisOHD3PNNdfw8MMPc8stt7BixQqaN28etet78cGbzje9A/AlgnQza25mzwA9zewe/7GXgWvN7LfAK8FOZmYTzWyTmW06cOBARAMXkRiVwAVzBQUFrFu3jieffJLf/va3JCcnR/X6EZ+4NrMM4NXy25+a2XXAFc65n/gf3whkO+em1PRamrgWqaWSknw9iMofoCdOQIMGUBqfI9Vbt26lW7dumBlfffUVTZo0idi1PJu4DiEfaFPpcWugwIM4RCRRJFDBnHOORx99lAsuuID58+cDRDRBnI4XSWIj0MnM2ptZPWAUsNSDOEQkUSRIwdzhw4e57rrruOuuu7jmmmsYMWKE1yFFtpjOzBYCfYE0M8sHZjnn5prZbcByIAmY55zbGsk4RCTBJUDBXG5uLsOHD+ejjz5izpw53HHHHZiZ12FFNkk454L+F3LOLQOWRfLaIlLLxPkd5nbt2sVXX33FypUrueyyy7wOp4KWlYqIeKS4uJjXX38dgEGDBpGXlxdTCQKUJEQkniRQwVxubi4XX3wxQ4cOZefOnQCkpKR4G1QQShIiEh8SpGDOOce8efPIysqioKCAV155hYyMDK/DCklJQkTiQwIUzDnnuPnmmxk/fjyXXHIJ7777LoMHD/Y6rCopSYhIfEiAO8yZGT169OCBBx5gxYoVnHfeeV6HdFq6n4SIxIfygrl+/b5pi4OCuePHj/PLX/6S3r17c/XVVzN16lSvQzoj6kmISHyIw4K5999/n+zsbB588EHWr1/vdThnRT0JEYkPcVQwV1paypw5c5g5cyZNmzZl6dKlDB061OuwzkrM3JkuHLTBn4jEgldffZWhQ4cyfPhwnnnmGVq0aOF1SFWKtQ3+REROFec1ECUlJZT/kZqTk8OqVatYvHhxzCeI01GSEBHvxXkNxDvvvEN2djaXXXYZ+/btw8zo169fTOy9VFNKEiLivTitgTh69CjTpk0jOzubvXv38sILL9CqVSuvwworTVyLiPfisAbiyJEj9OzZkw8//JBx48bx6KOP0qxZM6/DCjslCRHxXhzVQBw6dIjGjRuTkpLCTTfdxCWXXMKAAQO8DitiNNwkIt6LgxqIEydOMGfOHNq0acO//vUvAKZPn57QCQLUkxCRWBDjNRBr1qxh8uTJbNu2jZycHFq2bOl1SFGjJCEisSFGbxo0adIkfve735GRkRHXRXFnS8NNIiIBioqKKC807tSpEzNmzGDr1q21LkGAkoSIREOcFMqVlpYyd+5cOnbsyJ///GcApk6dyv333x+TNwSKBiUJEYmsOCmUW7lyJb169eInP/kJHTp0oEOHDl6HFBOUJEQksuKgUO6nP/0pAwcO5NChQyxatIi1a9eSlRV0K6NaRxPXIhJZMVoo98EHH9C2bVtSUlIYOHAgHTp0YMqUKTRo0MDTuGJNTPckzKyOmc02syfMbKzX8YjIWSgvlKvMw0K5Xbt2MW7cOLp3787TTz8NwLXXXstdd92lBBFE1JOEmc0zs/1mtiWgfZCZbTezPDOb5m8eBqQDJ4D8aMcqImEQI4VyBQUF3H777Zx//vn88Y9/5Gc/+xljx+pvz9PxYrhpPvAk8EJ5g5klAU8BP8SXDDaa2VKgM/CWc+53ZrYYWBn9cEWkRmKkUO7mm29m1apVjBs3jpkzZ9KmTZuoXj9eRb0n4Zx7E/gioDkbyHPO7XDOHQdewteLyAe+9D+nNNj5zGyimW0ys00HDhyIVNgiEkx1l7aOHg1btkBpqe97FBLEjh07mDRpEgUFBQD8+te/5sMPP+TZZ59VgjgDsTInkQ7srvQ439/2MnCFmT0BvBnsB51zzzrnspxzWfF+cw+RuBKjS1u3b9/O2LFjOf/885k/f37FPkuZmZla1noWYmV1U7A7czjn3BFgfLSDEZFqqLy0Fb5Z2jpliifba5SVlfGjH/2IJUuW0KBBA/7zP/+TO++8k/POOy/qsSSSWOlJ5AOV+3+tgQKPYhGR6oiBpa2lpaX885//BKBOnTq0aNGCX/ziF+zcuZNf//rXShBhECs9iY1AJzNrD+wBRgHXexuSiFTJw3tAFBUVMX/+fH7zm9/w8ccfs3XrVrp161axpFXCx4slsAuBt4DOZpZvZuOdcyXAbcByIBdY5JzbGu3YROQMeLC0tbCwkGnTptG2bVtuu+020tLSWLx4MZ07d47YNWu7qPcknHNBByudc8uAZVEOR0TOVpSWtpaVlbF//35atWpFnTp1ePrppxk4cCBTp06lT58+mAWb0pRwsfLtcBNBVlaW27Rpk9dhiEgYHDx4kPnz5/P000/TuHFjNm7ciJlV3D5UwsfMNjvngm5WFSsT1yISKzze1vu9995jwoQJpKenc8cdd5CWlsYdd9xRcX8HJYjoipWJaxGJBeW1D3Pn+lYqrV3rm2eAiC5r/fzzz6lfvz6pqals2rSJP/7xj4waNYrJkyfTq1eviF1XTk89CRH5RhS39S4tLeVvf/sb1113Heeddx7z5s0DYPTo0ezdu5e5c+cqQcQA9SRE5BtRqH1wzjFjxgwWLFjA7t27ad68OZMnT+aKK64AoGHDhjRs2DBs15OaUU9CRL4RoW298/PzWbx4MQBmxoYNG8jMzGTRokXs2bOH3/zmN3Tp0qVG15DIUE9CRL5RXvsQOCdxFsNNBw8eZMmSJbz44ousWbOGpKQkBg4cSNOmTVm+fDlJSUkReAESbkoSIvKNMNU+LFmyhBtuuIFjx47RqVMnZs2axfXXX0/Tpk0BlCDiiIabRBLdmS5pPcNtvQsLC5k3bx5XXnklS5YsAaBXr15MmjSJDRs2sH37dmbNmkWnTp3C9YokitSTEElkEVrSWlZWxnPPPceSJUtYtWoVpaWlZGRkcPToUQDat2/PY489FoYXIF5TxbVIIsvM9N3nofImfKtX+4aTtmwJ/XMBnHO8++677Nixg+HDhwPQpUsXSktLue666xgxYgQ9e/bUFhlxqqqKayUJkUSWlOS7IVBy8jdtJ05Agwa+4aQqFBcXs2rVKl555RVeffVV8vPzadasGQcOHCApKYkDBw6QlpamxJAAtC2HSG11BktanXPk5eVx/PhxAGbNmkVOTg4LFiygd+/ezJs3j9zc3IpJ5xYtWihB1AKakxBJZKdZ0vrll1+yatUqVqxYwd///nc++eQTVq9eTd++fRk3bhz9+/enb9++1K9f3+MXIl5RkhBJZAFLWo937kzRPffQbPRo3n33XXr16kVZWRmpqan079+fO++8s6KorXPnzrpPg2i4SSQunOXOrMeOHeOfrVtz/49+xMB+/Wi6cyf3+7fY6NatGzNnzuSf//wnhYWF/PWvf+XWW2+lVatWkXwlEmfUkxCJdWewjLW4uJhPP/2U888/H+ccnTt3ZteuXZgZPXr0YMKECQwdOhSA5ORk7rvvvii/GIk3Wt0kEuuqWMa67403WL9+PW+99Rbr169n8+bNpKen8/HHHwMwf/58mjVrxn/8x39wzjnnePQCJNZpCaxIPPMvYz0BvPvuu7z99ttMGj+eOikpTBg3jueff5569epx0UUX0adPH/r27UtOTo5WHkm1VZUkNNwkEsPee+89XmjWjI1ZWWz86KOKiub+jRrRpWtXbr/9dsaNG0evXr20AkkiQklCxGPOOT7++GM2b97Mpk2b2Lx5Mw888AB9+vThk08+4clDh7jg66+ZmJPD94YPp0/durS55x6YPZvMzEyvw5cEF9NJwsyuBnKAbwNPOedWeBuRyFlYuNBXl5Cby7HOnfngpptIHTmSDh068MEHH/C9732PgwcPAlCvXj169OhBUVERAIMHD+ZwURHJixf7znHTTWe9M6vI2Yj6nISZzQOGAPudc5mV2gcB/w0kAc875x6qdKwZ8KhzbnxV59achMSaEwsW8Ovbb+e9Xr14b98+PvjgA0pKS7lryBAeeeUVjh49yh133MFFF11EVlYW3bt3p169el6HLbVMTE1cm9kPgK+BF8qThJklAR8CPwTygY3AaOfcNv/xOcCLzrl3qjq3koR4Yd++fWzbto3c3Fxyc3PZunUr3bt358knn8R1706L/HwaNW1Kjx49fF9JSVz80ktkfPih16GLADE2ce2ce9PMMgKas4E859wOADN7CRhmZrnA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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Here, we compare n! to exp(n). Above about n = 5, n! passes exp(n) and\n", "# continues to increase at a higher rate than exp(n).\n", "\n", "# First, reproduce the factorial plot...\n", "plt.loglog(ns, facts, 'ro', fillstyle = 'none')\n", "plt.ylabel('n!');\n", "plt.xlabel('n')\n", "plt.title('log-log plot');\n", "\n", "# ... the add the exponential data.\n", "xx = np.arange(1, finish, 0.01)\n", "yexp = np.exp(xx)\n", "plt.loglog(xx, yexp, 'k--')\n", "plt.legend(('n!', 'exp(n)'));" ] }, { "cell_type": "code", "execution_count": 26, "id": "moral-colon", "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Enter an integer start value: 1\n", "Enter an integer end value: 120\n" ] } ], "source": [ "# Finally, here's an implementation of our nested control structures in\n", "# which the user is prompted to enter in start and end values for the n!\n", "# calculation and then the plot comparing n! and e^n is generated.\n", "start = int(input(\"Enter an integer start value: \")) \n", "finish = int(input(\"Enter an integer end value: \")) \n", "ns = np.arange(start, finish + 1, 1)\n", "facts = []\n", "for i in ns:\n", " if i % 1 == 0 and i > 0:\n", " n = int(i)\n", " factorial = 1\n", " while n > 1:\n", " factorial = factorial*n\n", " n -= 1\n", " facts = facts + [factorial]\n", " elif i == 0:\n", " facts = facts + [1]\n", " elif i % 1 != 0 and n > 0:\n", " print('Invalid entry: n is noninteger.')\n", " elif i % 1 == 0 and n < 0:\n", " print('Invalid entry: n negative.')\n", " elif i % 1 != 0 and n < 0:\n", " print('Invalid entry: n is noninteger and negative.')" ] }, { "cell_type": "code", "execution_count": 27, "id": "parental-clinton", "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Here are plots of n! vs n...\n", "plt.loglog(ns, facts, 'ro', fillstyle = 'none')\n", "plt.ylabel('n!');\n", "plt.xlabel('n')\n", "plt.title('log-log plot')\n", "\n", "# and exp(n) vs n\n", "xx = np.arange(start, finish, 0.01)\n", "yexp = np.exp(xx)\n", "plt.loglog(xx, yexp, 'k--')\n", "plt.legend(('n!', 'exp(n)'));" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.8.8" } }, "nbformat": 4, "nbformat_minor": 5 }